<?php

namespace App\server;


class RedisServer
{
   //私有的静态属性：存放实例化获得对象
   private static $object;
   private static $redis;
   //私有的构造方法：防止在类外实例化对象
   private function __construct()
   {
       self::$redis = new \Redis();
       self::$redis->connect('120.48.57.223');
       self::$redis->auth('123456');
   }
   //私有的克隆方法：放置在类外克隆
   private function __clone()
   {
       // TODO: Implement __clone() method.
   }
   //公共的静态方法：为类提供一个统一的入口
   public static function createRedisObject()
   {
       //判断对象是否存在，如果存在则直接返回对象实例，无需创建
       // instanceof  判断对象 是否属于 某个类
       if (!self::$object instanceof RedisServer)
       {
           //创建对象
           return self::$object = new RedisServer();
       }
       //直接返回该对象
       return  self::$object;
   }
   /**
    * @param $key
    * @return array|null
    */
   public function sMembers($key)
   {
       $data=self::$redis->sMembers($key);
       if (!$data)  return null;
       return $data;
   }
   /**
    * @param $key
    * @param $value
    * @return bool
    */
   public function set($key,$value){
       return self::$redis->set($key,$value);
   }

   public function get($key){
       return self::$redis->get($key);
   }
   /**
    * redis 永久存储
    * @lak
    *移除给定 key 的过期时间，使得 key 永不过期。
    */
   public function persist($key){
       self::$redis->persist($key);
       return true;
   }
   /**
    * redis hash
    * 所有数据存入hash
    */
    public function hSetAll($data)
    {
        foreach ($data as $key => $value) {
            $key = array_keys($value);
            for ($i = 0; $i < count($key); $i++) {
                self::$redis->hset($value['id'], $key[$i], $value[$key[$i]]);
            }
        }
    }

    /**
     * 选择新的库
     * @param $key
     */
    public function select($key)
    {
        self::$redis->select($key);
    }

    /**
     * 使用redis的队列push
     * @param $key
     * @param $data
     * @return bool
     */
    public function Data_lpush($key, $data)
    {
        self::$redis->lpush($key, $data);
        return true;
    }

    /**
     * 将搜索历史存储到Redis列表中，最多存储十个记录
     * @param $key
     * @param $start
     * @param $end
     * @return bool
     */
    public function lTrim($key, $start, $end)
    {
        self::$redis->ltrim($key, $start, $end);
        return true;
    }

    /**
     * 设置搜索历史记录的过期时间为七天
     * @param $key
     * @param $time
     * @return bool
     */
    public function expire($key, $time)
    {
        self::$redis->expire($key, $time);
    }

    /**
     *redis 判断值是否存在某个数据库中
     * @param $key
     * @return bool
     */
    public function sismember($key, $data)
    {
        self::$redis->sIsMember($key, $data);
        return true;
    }

    /**
     *将搜索关键字存储到Redis有序集合中，以搜索次数为分值
     */
    public function zIncrBy($k, $num, $name)
    {
        self::$redis->zincrby($k, $num, $name);
        return true;
    }

    /**
     *获取redis缓存的历史搜索
     */
    public function lRange($key, $start, $end)
    {
        return self::$redis->lRange($key, $start, $end);
    }

    /**
     *获取搜索热搜排行榜
     * lak
     */
    public function zRevRange($k, $n, $e)
    {
        return self::$redis->zRevRange($k, $n, $e, true);
    }

    /**
     *将数据存储到redis设置
     * lak
     *  将键 key 的值设置为 value ， 并可以设置生存时间。 如果键 key 已经存在， 那么 SETEX 命令将覆盖已有的值。
     *    SETEX 是一个原子（atomic）操作， 它可以在同一时间内完成设置值和设置过期时间这两个操作，
     */
    public function setex($key, $time, $code)
    {
        self::$redis->setex($key, $time, $code);
        return true;
    }

    /**
     *获取redis数据
     * lak
     */
    public function GetRedis($key)
    {
        return self::$redis->get($key);
    }

    /**
     *添加元素之前使用 lrem 命令删除列表中的重复元素
     * @lak
     */
    public function lrem($key, $n, $data)
    {
        self::$redis->lrem($key, $n, $data);
        return true;
    }

    /**
     *添加元素
     * @lak
     * @param $name
     * @param 添加详情信息到 redis
     * @return
     */
    public function hset($key, $name, $value)
    {

        return self::$redis->hset($key, $name, $value);
    }
    /**
     * redis hash
     * hash取出详情数据
     *  hgetAll 命令用于获取哈希表中所有键值对
     */
    public function hGetone($id)
    {
        return self::$redis->hgetAll($id);
    }

    /**
     * redis hash
     * 取出所有数据
     */
    public function getAll()
    {
        $arr = [];
        $size = self::$redis->keys('*');//keys 取出库中所以的key值
        for ($i = 0; $i < count($size); $i++) {
            $data = self::$redis->hgetAll($size[$i]);
            if (!empty($data)) $arr[] = $data;
        }
        return $arr;
    }

    /**
     * 添加有序集合
     * @param $key
     * @param $score
     * @param $value
     * @return int|\Redis
     */
    public function zadd($key, $score, $value)
    {
        return self::$redis->zAdd($key, $score, $value);
    }

    public function hSetone($data)
    {
        foreach ($data as $key => $value) {
            self::$redis->hset($data['id'], $key, $value);
        }
    }

    /**
     * redis hash
     * 删除
     */
    public function del($id)
    {
        self::$redis->del($id);
    }
}
